//
// Created by Sugars Mac on 2020/5/27.
//

#ifndef LINUXNPHW_DATARS_H
#define LINUXNPHW_DATARS_H

#include "relation.h"

#define PORT 8000
#define MAXMEM 10   // 最大连接数
#define BUFFSIZE 128  // 消息最大长度

#define DEBUG_PRINT 1
#ifdef DEBUG_PRINT
#define DEBUG(format, ...) printf("FILE: "__FILE__", LINE: %d: "format"\n", __LINE__, ##__VA_ARGS__)
#else
#define DEBUG(format, ...)
#endif

int listenfd;
user_t users[MAXMEM]; // 包含了socket文件描述符和用户名的映射
room_t rooms[MAXMEM]; // 最大允许每个用户创建一个房间
relationMap * list;

TableList_t * head;  // 从文件中读取的用户信息用链表存储

enum {GENE, PRIV, REPL, QUIT, DISC, EMPT, OUTR, CRRM, JOIN, HELP, LSUS, LSRM, MEMB};
// 用户消息类型：普通（群发）、私聊、回复私聊、退出私聊、断开连接、空消息、退出群聊、创建群聊、加入群聊、显示帮助信息、显示所有已登陆、显示所有聊天室、显示聊天室中的用户

char * help_message;

// 数据接收处理模块
void rcv_snd(int n);

// 用户登陆，
void user_login(int userIndex);

// 判断用户请求类型
int processUserInput(int userIndex, char* buf);

// 将 userIndex 发送的 mess 中的数据群发给所有已链接用户
void GroupMessage(int userIndex, char *mess, int roomId);
// 用户断开连接
void userDisconnect(int userIndex);
// 用户私聊请求
void privChat(int userIndex, char* rela_mess);
// 用户回复私聊
void replyTo(int ueserIndex, char* rela_mess);
// 显示帮助信息
void showHelp(int userIndex);
// 显示所有以登陆用户
void showLoginUsers(int userIndex);
// 显示所有已创建房间
void showAllRooms(int userIndex);
// 加入房间,rela_mess中包含房间名（密码）
void joinRoom(int userIndex, char* rela_mess);
// 创建群聊, rela_mess中包含房间名（密码）
void createRoom(int userIndex, char* rela_mess);
// 退出群聊
void quitRoom(int userIndex, int groupId);
// 处理用户在群中的发言
void inRoom(int userIndex);
// 列举群聊中的用户
void listUserInRoom(int roomId, char * buf);
// 清理群聊房间，如果在群中的人数为0，则撤销该群
void cleanRoom(int roomId);

#endif //LINUXNPHW_DATARS_H
